package com.smart.community.commons.dto;

import java.time.LocalDateTime;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;

import lombok.Data;

/**
 * 文件信息数据传输对象
 * 用于处理JSON格式的文件信息
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 1.0.0
 */
@Data
public class FileInfoDTO {
    
    /**
     * 文件ID
     */
    @JsonProperty("id")
    private String id;
    
    /**
     * 文件名
     */
    @JsonProperty("fileName")
    private String fileName;
    
    /**
     * 文件URL
     */
    @JsonProperty("fileUrl")
    private String fileUrl;
    
    /**
     * 文件大小（字节）
     */
    @JsonProperty("fileSize")
    private Long fileSize;
    
    /**
     * 上传类型
     */
    @JsonProperty("uploadType")
    private String uploadType;
    
    /**
     * 上传来源
     */
    @JsonProperty("uploadSource")
    private String uploadSource;
    
    /**
     * 文件状态
     */
    @JsonProperty("status")
    private String status;
    
    /**
     * 创建时间
     */
    @JsonProperty("createTime")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    
    /**
     * 文件类型
     */
    @JsonProperty("fileType")
    private String fileType;
    
    /**
     * 文件扩展名
     */
    @JsonProperty("fileExtension")
    private String fileExtension;
    
    /**
     * 文件MD5值
     */
    @JsonProperty("fileMd5")
    private String fileMd5;
    
    /**
     * 原始文件名
     */
    @JsonProperty("originalFileName")
    private String originalFileName;
    
    /**
     * 文件路径
     */
    @JsonProperty("filePath")
    private String filePath;
    
    /**
     * 缩略图URL
     */
    @JsonProperty("thumbnailUrl")
    private String thumbnailUrl;
    
    /**
     * 文件描述
     */
    @JsonProperty("description")
    private String description;
    
    /**
     * 标签
     */
    @JsonProperty("tags")
    private String tags;
    
    /**
     * 是否公开
     */
    @JsonProperty("isPublic")
    private Boolean isPublic;
    
    /**
     * 下载次数
     */
    @JsonProperty("downloadCount")
    private Integer downloadCount;
    
    /**
     * 查看次数
     */
    @JsonProperty("viewCount")
    private Integer viewCount;
    
    /**
     * 排序
     */
    @JsonProperty("sortOrder")
    private Integer sortOrder;
    
    /**
     * 备注
     */
    @JsonProperty("remark")
    private String remark;
    
    /**
     * 默认构造函数
     */
    public FileInfoDTO() {
        this.createTime = LocalDateTime.now();
        this.status = "success";
        this.isPublic = true;
        this.downloadCount = 0;
        this.viewCount = 0;
        this.sortOrder = 0;
    }
    
    /**
     * 构造函数
     * 
     * @param id 文件ID
     * @param fileName 文件名
     * @param fileUrl 文件URL
     * @param fileSize 文件大小
     * @param uploadType 上传类型
     * @param uploadSource 上传来源
     */
    public FileInfoDTO(String id, String fileName, String fileUrl, Long fileSize, 
                      String uploadType, String uploadSource) {
        this();
        this.id = id;
        this.fileName = fileName;
        this.fileUrl = fileUrl;
        this.fileSize = fileSize;
        this.uploadType = uploadType;
        this.uploadSource = uploadSource;
    }
    
    /**
     * 获取文件大小格式化字符串
     * 
     * @return 格式化的文件大小
     */
    public String getFileSizeFormatted() {
        if (fileSize == null || fileSize == 0) {
            return "0 B";
        }
        
        String[] units = {"B", "KB", "MB", "GB", "TB"};
        int unitIndex = 0;
        double size = fileSize;
        
        while (size >= 1024 && unitIndex < units.length - 1) {
            size /= 1024;
            unitIndex++;
        }
        
        return String.format("%.2f %s", size, units[unitIndex]);
    }
    
    /**
     * 获取文件扩展名
     * 
     * @return 文件扩展名
     */
    public String getFileExtension() {
        if (fileName == null || fileName.isEmpty()) {
            return "";
        }
        
        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex > 0 && lastDotIndex < fileName.length() - 1) {
            return fileName.substring(lastDotIndex + 1).toLowerCase();
        }
        
        return "";
    }
    
    /**
     * 判断是否为图片文件
     * 
     * @return 是否为图片
     */
    public boolean isImage() {
        String extension = getFileExtension();
        return "jpg".equals(extension) || "jpeg".equals(extension) || 
               "png".equals(extension) || "gif".equals(extension) || 
               "bmp".equals(extension) || "webp".equals(extension);
    }
    
    /**
     * 判断是否为文档文件
     * 
     * @return 是否为文档
     */
    public boolean isDocument() {
        String extension = getFileExtension();
        return "pdf".equals(extension) || "doc".equals(extension) || 
               "docx".equals(extension) || "xls".equals(extension) || 
               "xlsx".equals(extension) || "ppt".equals(extension) || 
               "pptx".equals(extension) || "txt".equals(extension);
    }
    
    /**
     * 判断是否为视频文件
     * 
     * @return 是否为视频
     */
    public boolean isVideo() {
        String extension = getFileExtension();
        return "mp4".equals(extension) || "avi".equals(extension) || 
               "mov".equals(extension) || "wmv".equals(extension) || 
               "flv".equals(extension) || "mkv".equals(extension);
    }
    
    /**
     * 判断是否为音频文件
     * 
     * @return 是否为音频
     */
    public boolean isAudio() {
        String extension = getFileExtension();
        return "mp3".equals(extension) || "wav".equals(extension) || 
               "flac".equals(extension) || "aac".equals(extension) || 
               "ogg".equals(extension);
    }
}
